// TODO: 25/5/29
// 变量的作用域
package main

import "fmt"

// 全局变量：在当前go文件中生效...
// 全局变量的定义必须使用var关键字，如果直接使用 := 则无法创建该变量
var d int = 10

// e := 10//这个时候就会报错，所以我们不能使用这种语法糖

// 全局变量和局部变量是可以进行重名的,优先级？
var e int

func main1() {
	//局部变量：只在一定的范围内生效...
	//在函数体内声明的变量
	var a int = 3
	var b int = 4
	c := a + b
	// Printf 格式化输出 (参数一：需要打印的内容，%d是占位符，通过后续参数给他一一赋值)
	fmt.Printf("a=%d,b=%d,c=%d\n", a, b, c)
	fmt.Println(d)
	//fmt.Println(e)

	fmt.Println("===========================")
	// 如果全局变量有，那么直接使用全局变量来接收
	e = a + b
	fmt.Printf("a=%d,b=%d,e=%d\n", a, b, e)
	fmt.Printf("e的内存地址：%p\n", &e)

	//但是如果在局部和全局同名的变量，优先使用局部变量，
	b = 1
	e := a + b
	fmt.Printf("a=%d,b=%d,e=%d\n", a, b, e)
	fmt.Printf("e的内存地址：%p\n", &e)
	b = 5
	e = a + b
	fmt.Printf("a=%d,b=%d,e=%d\n", a, b, e)
	fmt.Printf("e的内存地址：%p\n", &e)
}

// 在函数体中，几乎所有的语言都是遵循优先的就近原则
// 示例：
var a float64 = 3.14

// 全局变量定义了可以不去使用
func main() {
	fmt.Println(a) //这个程序扫描的时候，它离上面的a更近一些
	var a float64 = 2.18
	fmt.Println(a) //这个离函数体中的a会更近一些
}

//程序的执行原则：
//自上而下

//Go语言程序中全局变量与局部变量名称可以相同，但是在函数体内的局部变量会被优先考虑
